eRDMA:使用高性能网络进行分布式训练

弹性RDMA(Elastic Remote Direct Memory Access,简称eRDMA)是阿里云自研的云上弹性RDMA网络。PAI通用计算资源中的部分GPU机型已支持eRDMA能力,您只需使用特定镜像提交基于这些GPU机型的DLC任务,系统将自动在容器内挂载eRDMA网卡,从而加速分布式训练过程。

使用限制

  • 仅适用于基于通用计算资源(预付费)提交的训练作业。

  • 仅适用于2.19及以上的NCCL版本。

  • 目前PAI DLC平台支持eRDMAGPU机型及对应的eRDMA网卡数量如下:

    GPU机型

    eRDMA网卡数量

    ecs.ebmgn7v.32xlarge

    2

    ecs.ebmgn8v.48xlarge

    2

    ecs.ebmgn8is.32xlarge

    2

    ecs.ebmgn8i.32xlarge

    4

    ecs.gn8is.2xlarge

    1

    ecs.gn8is.4xlarge

    1

    ecs.gn8is-2x.8xlarge

    1

    ecs.gn8is-4x.16xlarge

    1

    ecs.gn8is-4x.16xlarge

    1

平台预置环境变量

PAI基于通用计算资源中已经支持eRDMA的机型,自动开启了eRDMA特性,并默认设置了NCCL环境变量。您可以根据训练框架、通信框架以及模型特点进行必要的调整。强烈建议您使用平台预置系统内的默认变量, 可以获得较优性能。

公共环境变量

环境变量

PYTHONUNBUFFERED

1

TZ

根据当前作业所在的Region进行设定,一般是"Asia/Shanghai"。

eRDMA高性能网络变量

说明

值“-”表示该环境变量在该环境中无效。

环境变量

NCCL_DEBUG

INFO

NCCL_SOCKET_IF_NAME

eth0

NCCL_IB_TC

-

NCCL_IB_SL

-

NCCL_IB_GID_INDEX

1

NCCL_IB_HCA

erdma

NCCL_IB_TIMEOUT

-

NCCL_IB_QPS_PER_CONNECTION

8

NCCL_MIN_NCHANNELS

16

NCCL_NET_PLUGIN

none

配置自定义镜像

基于支持eRDMA的通用计算资源提交训练任务时,您可以自行构建并使用自定义镜像。注意事项如下:

环境要求

  • CUDA >= 12.1

  • NCCL >= 2.19

  • Python3

安装eRDMA

根据镜像中的Linux发行版本不同,eRDMA库安装也有所不同。以下内容以Ubuntu 22.04版本为例,介绍如何安装eRDMA库,代码示例如下:

# 添加PGP签名。
wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg

# 添加apt源。
echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu jammy/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list

# 更新&安装eRDMA用户态驱动程序包。
sudo apt update
sudo apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1

其他发行版本的安装流程,请参考Docker容器中使用eRDMA

示例Dockerfile

# ${user_docker_image_url} 请替换成您自己的已经存在的Docker镜像。
FROM ${user_docker_image_url}

# 如果镜像中已经预装了RDMA库,需要先卸载掉。
RUN rm /etc/apt/sources.list.d/mellanox_mlnx_ofed.list && \
    apt remove -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1

RUN wget -qO - http://mirrors.aliyun.com/erdma/GPGKEY | gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg && \
    echo "deb [ ] http://mirrors.aliyun.com/erdma/apt/ubuntu jammy/erdma main" | tee /etc/apt/sources.list.d/erdma.list && \
    apt update && apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1

使用MPIJob执行NCCL Test测试

提交使用MPIJob框架的训练任务,并配置以下关键参数,其他参数配置说明,请参见快速提交MPIJob训练任务

参数

描述

环境信息

节点镜像

镜像地址页签,输入已准备的自定义镜像。

您可以使用PAI-DLC提供的NCCL测试镜像,该镜像已预装了eRDMA的依赖:dsw-registry.<RegionID>.cr.aliyuncs.com/pai/nccl-tests:12.2.2-cudnn8-devel-ubuntu22.04-nccl2.19.3-1-85f9143

其中<RegionID>支持的地域列表如下:

  • cn-wulanchabu

  • cn-beijing

  • cn-shanghai

  • cn-hangzhou

  • cn-shenzhen

启动命令

# -np 16 -npernode 8 表示使用2个节点,每个节点8张卡,总共16张卡。
mpirun --allow-run-as-root -np 16 -npernode 8 --bind-to none -mca btl_tcp_if_include eth0 -x UCX_TLS=tcp -x UCX_NET_DEVICES=eth0 -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_IB_DISABLE=0 -x NCCL_IB_GID_INDEX=1 -x NCCL_IB_QPS_PER_CONNECTION=8 -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x NCCL_MIN_NCHANNELS=16 -x NCCL_ALGO=Ring -x PATH /opt/nccl-tests/build/all_reduce_perf -b 32K -e 4G -f 2 -g 1 -t 1 -n 20

资源信息

资源来源

选择资源配额

资源配额

选择已创建的通用计算资源配额,例如资源规格为ecs.ebmgn8v.48xlarge。如何创建资源配额,请参见通用计算资源配额

框架

选择MPIJob

任务资源

配置以下参数:

  • 节点数量:2

  • GPU(卡数):8

  • CPU(核数):64

  • 内存(GiB):256

  • 共享内存(GiB):256

eRDMA网络带宽的NCCL Test示例结果如下:image